package com.example.springmvc;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class SpringMvcApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringMvcApplication.class, args);

        // **** Spring web MVC 入门 ****
        // 什么是 Spring Web MVC？
        // Spring Web MVC 是基于 Servlet API 构建的原始 Web 框架，从⼀开始就包含在 Spring 框架中。它的
        //正式名称“Spring Web MVC”来⾃其源模块的名称(Spring-webmvc)，但它通常被称为Spring MVC

        // 那么Spring Boot 就是类似一个Spring 的简化
        // 之间建的springboot项目就是 spring web mvc 项目的其中一个
        // springboot是帮我们快速的搭建一个项目
        // spring MVC 只是其中的一个模块
        // 有了这个模块 就可以经行 Java项目开发
        // 当前把 spring mvc 理解成 spring  web 就可以了

        // 什么是Servlet呢? (了解)
        //Servlet 是⼀种实现动态⻚⾯的技术. 准确来讲Servlet是⼀套 Java Web 开发的规范，或者说是⼀套
        //Java Web 开发的技术标准. 只有规范并不能做任何事情，必须要有⼈去实现它. 所谓实现 Servlet 规
        //范，就是真正编写代码去实现 Servlet 规范提到的各种功能，包括类、⽅法、属性等.
        //Servlet 规范是开放的，除了 Sun 公司，其它公司也可以实现 Servlet 规范，⽬前常⻅的实现了
        //Servlet 规范的产品包括 Tomcat、Weblogic、Jetty、Jboss、WebSphere 等，它们都被称为"Servlet 容器"
        // Servlet 容器⽤来管理程序员编写的 Servlet 类

        // **** MVC 定义 ****
        // MVC 是 Model View Controller 的缩写，它是软件⼯程中的⼀种软件架构设计模式，它把软件系统分
        // 为模型、视图和控制器三个基本部分
        // View(视图) 指在应⽤程序中专⻔⽤来与浏览器进⾏交互，展⽰数据的资源.
        //• Model(模型) 是应⽤程序的主体部分，⽤来处理程序中数据逻辑的部分.
        //• Controller（控制器）可以理解为⼀个分发器，⽤来决定对于视图发来的请求，需要⽤哪⼀个模型来处理，
        // 以及处理完后需要跳回到哪⼀个视图。即⽤来连接视图和模型

        // 关系模型:
        //View(视图)界面显示,人机交互---1.请求--->Controller(控制器)选择处理模型选择,处理视图----2.选择模型,进行处理---->Model(模型) 处理业务逻辑,处理数据
        //                       <--4.响应(选择响应模板,填充数据)--                   <----3.返回处理结果--------



        // 简单来说 : MVC 就是 把一个项目分成了三个部分

        // MVC 是一种思想
        // spring 进行了实现, 所以称为spring MVC
        // 对于 Spring 而言 , 上面的模型就不合适了

        // 下面这个关系模型:
        /*
               (就如我们创建的 TestController 这个代码, 这个只是我们自己起的名字)
                                    |
        4.响应(选择视图,展示模型)--- Controller(控制器)--------2. 选择模型 ,进行处理
                |                  ^       ^                    |
                |                  |       |                    |
                ↓                  |   3.返回处理结果              ↓
            View(视图)              |       |                Model(模型)
        页面排版布局,展示模型数据       |       ---------------处理业务逻辑, 处理数据
                |                1.请求
                |                  |
                |                  |
        5.返回给浏览器------------> 浏览器


        * */

        // 当然 SpringBoot 只是 创建 Spring MVC的一种方式
        // 创建Spring MVC 有很多种方式
        // 只要包含了web 这个模块, 我们就认为是一个 Spring MVC项目
        // 当前的发展阶段 已经没有 视图这一层了
        // 那么 当前 阶段, 后端的开发人员不涉及前端的开发, 所以也就没有 view层了
        //              所以 view 层又有了一层解释, 之前返回的是 视图, 现在返回的是视图所需要的数据


        //**** 学习Spring MVC ****
        // 有三个方面
        // 1. 建立连接(浏览器和服务器 / 客户端和服务器)
        //  TestController 中 就已经出现了建立连接了
        // 那就是 通过 @RequestMapping("t1") 这个标签 ,
        // @RequestMapping 路由映射
        // 写了这个之后 就建立连接了 (实现原理还是通过 tomcat)

        // @RequestMapping 可以修饰 方法 也可以修饰 类
        // 访问地址: 类的路径 + 方法路径
        //  如果类上面没有这个标签, 那就可以直接访问方法上面的这个路经
        //  如果 类上面有的话, 那么访问的时候就是: 127.0.0.1:8080/类/方法
        // 其中路径也可以写多层
        // 那就是 127.0.0.1:8080/类/后面的/方法/后面的,
        // 其中 / 可以省略(省略是指在@RequestMapping标签中省略), 但是在企业中还是建议加上
        // 还是要遵守一个标准 (前加后不加)

        // 但是 在学习 Servlet 的时候 , 首先要确定发来的是什么样的请求呢?
        // 是 GET呢 还是 POST 呢?
        // 根据这样才能确定后端接口建立什么样的 doGet 或者 doPost 方法
        // 但是Spring 这里就不需要这些了
        // @RequestMapping  这个标签什么样的http 请求类型 都可以支持, 支持了所有的请求

        // 但是如果只想要支持一种类型的请求呢?
        // 只需要在@RequestMapping标签中,里面的路径 加上 , 和 method = RequestMethod.GET
        //                                          或者 method = RequestMethod.其他
        // 此时就限制必须使用这个请求


        // 企业建议给每一个 Controller 都建立一个路径, (也就是加一个 类路径, 可以避免重复,也方便查找代码)

        // 2. 请求

        // 请求 主要就是学习如何传参
        //   1. 传递单个参数
        //   2. 多个参数
        //   3. 对象
        //   4. 数组/集合.
        //   5. 最重要的, 也是在工作中经常使用的. 传递 json
        //          (上面四个方式加在一起都没有传递json的多)
        // json 本质上 是一个字符串, 是可以表示成对象的字符串, 通常表示为 json 字符串
        // 前面四个方法,的扩展性很差,每次在更改数据的时候都需要重新更改参数的定义,接口发生改变
        //  这个阶段的 接口 是指 API
        //  所谓API 就是 应用程序 提供了哪些服务, 然后调用方法来去使用
        //  接口如果对应到代码上, 通常是指一些方法
        //  相对应到工作中, 接口这个称呼是很灵活的

        // json 的语法:
        // 数据保存在键值对(Key/Value)中
        // 键和值使用冒号分割
        // 数据用逗号分割
        // 对象用{}表示, 数组用[]表示
        // 值可以为对象, 也可以为数组, 数组中可以包含多个对象

        //   6.获取URL中参数@PathVariable
        //   7.上传⽂件@RequestPart
        //   8.获取Cookie 和 Session
        //    这里面有一个 面试题
        //  Cookie 和 Session 的区别
        //• Cookie 是客⼾端保存⽤⼾信息的⼀种机制. Session 是服务器端保存⽤⼾信息的⼀种机制.
        //• Cookie 和 Session之间主要是通过 SessionId 关联起来的, SessionId 是 Cookie 和 Session 之间的桥梁
        //• Cookie 和 Session 经常会在⼀起配合使⽤. 但是不是必须配合.
        //◦ 完全可以⽤ Cookie 来保存⼀些数据在客⼾端. 这些数据不⼀定是⽤⼾⾝份信息, 也不⼀定是SessionId
        //◦ Session 中的sessionId 也不需要⾮得通过 Cookie/Set-Cookie 传递, ⽐如通过URL传递

        //   9.获取 Header
        // 在ParamController里面一一展示.

        // 3. 响应

        // 1.返回静态页面
        // 在 resource 包中的 static 包里面 编写
        // 那么如何在后端返回这个页面呢
        // 2.返回数据 @ResponseBody
        // 3.返回HTML代码片段
        // 4.返回JSON
        // 5.设置状态码
        // 6.设置 Content-Type (这个用的很少, 了解即可)

    }

}
